package com.foruo.learn.designmode.singleton;

/**
 * 单例 - 懒汉式 - 双检锁（即类加载时没有实例化，调用取得实例的方法getInstance()的时候才实例化对象）
 * @author GaoYuan
 * @date 2018/5/4 上午8:09
 */
public class SingletonDemoEntity3 {
    /** 注意 static 并且没有初始化 */
    private static SingletonDemoEntity3 singletonDemoEntity = null;

    /** 注意 private */
    private SingletonDemoEntity3(){}

    /**
     * 注意 synchronized 不在方法上，而在if里面，这样只有第一次才进行同步，之后的每次调用因为已经有对象，则不会再进入同步方法中
     * 高并发的场景下，又要使用懒汉式，则推荐使用 此方 法
     * */
    public static SingletonDemoEntity3 getInstance(){
        if(singletonDemoEntity == null){
            synchronized (SingletonDemoEntity3.class){
                if(singletonDemoEntity == null) {
                    singletonDemoEntity = new SingletonDemoEntity3();
                }
            }
        }
        return singletonDemoEntity;
    }


    public static void main(String[] args){
        MyThread3 myThread = new MyThread3();

        Thread thread1 = new Thread(myThread);
        Thread thread2 = new Thread(myThread);
        Thread thread3 = new Thread(myThread);

        thread1.start();
        thread2.start();
        thread3.start();

        //此处可见三次打印相同内容，则表示是同一个对象
    }


}

class MyThread3 extends Thread{

    @Override
    public void run() {
        System.out.println(SingletonDemoEntity3.getInstance().hashCode());
    }

}
